import {
  Controller,
  Get,
  Post,
  Param,
  Body,
  UnauthorizedException,
  UseFilters,
  ForbiddenException,
  HttpCode,
  HttpStatus,
  HttpException,
  ParseIntPipe,
  UseInterceptors,
} from '@nestjs/common';
// import { Request } from 'express';
import { CreateCatDto } from './dto/create-cat.dto';
import { CatsService } from './cats.service';
import { HttpExceptionFilter } from 'src/common/filter/http-exception.filter';
import { TransformInterceptor } from 'src/common/interceptor/transform.interceptor';

// @Controller() 装饰器中使用路径前缀可以让我们轻松地对一组相关路由进行分组，并最大限度地减少重复代码
@Controller('cats')
export class CatsController {
  // private 语法的使用。这种简写允许我们立即在同一位置声明和初始化 catsService 成员
  constructor(private catsService: CatsService) {}

  @Post()
  async createServiceCat(@Body() createCatDto: CreateCatDto) {
    this.catsService.create(createCatDto);
  }

  @Get()
  async findAllServiceCat() {
    return this.catsService.findAll();
  }

  // @Get() HTTP 请求方法装饰器告诉 Nest 为 HTTP 请求的特定端点创建处理程序
  @Get('/unauth')
  async findAll(): Promise<string[]> {
    throw new UnauthorizedException('Not Found', {
      cause: new Error(),
      description: 'Not Found',
    });
  }

  @Get('/forbidden')
  @UseFilters(new HttpExceptionFilter())
  async findAllForbidden(): Promise<string[]> {
    throw new HttpException('Forbidden', HttpStatus.FORBIDDEN);
  }

  @Get('/test')
  @HttpCode(201) //默认情况下响应状态代码始终为 200。我们可以通过在处理程序级别添加 @HttpCode(...) 装饰器来轻松更改此行为。
  // 我们在这里选择的方法名称是完全任意的。显然，我们必须声明一个方法来绑定路由，但 Nest 对所选择的方法名称没有任何意义。
  test(): { name: string; age: number } {
    // 当请求处理程序返回 JavaScript 对象或数组时，它将自动序列化为 JSON。
    return { name: 'hxb', age: 18 };
  }

  @Get('/:id')
  @UseInterceptors(TransformInterceptor)
  findOne(@Param('id', ParseIntPipe) id: number): string {
    console.log(id);
    // 当它返回 JavaScript 基本类型（例如 string、 number、 boolean）时，Nest 将仅发送该值，而不尝试对其进行序列化。
    return `This action returns a #${id} cat`;
  }

  @Post('create')
  // 这里的参数没获取到 AI建议@Req() request: Request来获取body
  async createCat(@Body() createCatDto: CreateCatDto): Promise<string> {
    console.log('请求参数', createCatDto.name);
    return 'This action adds a new cat';
  }

  @Post('create-filter')
  // @UseFilters(new HttpExceptionFilter())
  create(@Body() createCatDto: CreateCatDto): string {
    console.log(createCatDto);
    throw new ForbiddenException();
  }
}
